//
//  ZegoAVContainerComponent.swift
//  ZegoUIKitExample
//
//  音视频容器核心组件 - 负责管理多路音视频流的布局和渲染
//  关键特性：
//  1. 支持多种布局模式（画中画、画廊模式等）
//  2. 提供自定义视图注入能力
//  3. 用户列表动态排序
//  Created by zego on 2022/7/15.
//

import UIKit
import ZegoExpressEngine

// MARK: - 容器委托协议
public protocol ZegoAudioVideoContainerDelegate: AnyObject {
    /// 获取自定义前景视图（用户头像、标签等）
    /// - Parameter userInfo: 目标用户信息（nil表示本地预览视图）
    /// - Returns: 实现ZegoBaseAudioVideoForegroundView的自定义视图
    func getForegroundView(_ userInfo: ZegoUIKitUser?) -> ZegoBaseAudioVideoForegroundView?
    
    /// 自定义用户列表排序规则
    /// - 典型应用：主播置顶、连麦用户优先显示
    /// - 默认实现：保持原始顺序（见下方扩展）
    func sortAudioVideo(_ userList: [ZegoUIKitUser]) -> [ZegoUIKitUser]?
    
    /// 用户ID更新回调（用于映射业务用户ID）
    func onUserIDUpdated(userID: String) -> String?
}

// 提供协议方法的默认实现（可选方法）
extension ZegoAudioVideoContainerDelegate {
    func sortAudioVideo(_ userList: [ZegoUIKitUser]) -> [ZegoUIKitUser]? {
        return userList // 默认不改变排序
    }
}

// MARK: - 音视频容器主类
public class ZegoAudioVideoContainer: NSObject {
    
    // MARK: 公共属性
    /// 容器视图委托（业务方实现自定义逻辑）
    public weak var delegate: ZegoAudioVideoContainerDelegate?
    
    /// 核心容器视图（承载所有音视频视图）
    public var view: ZegoAudioVideoContainerView!
    
    // MARK: 私有组件
    /// 事件处理帮助类（桥接UIKit事件和容器逻辑）
    private let help: ZegoAudioVideoContainer_Help = ZegoAudioVideoContainer_Help()
    
    // MARK: 初始化
    public override init() {
        super.init()
        self.view = ZegoAudioVideoContainerView()
        self.help.container = self // 建立双向引用
    }
    
    // MARK: 布局配置
    /// 设置布局模式（基础版）
    /// - Parameters:
    ///   - mode: 布局模式（画中画/画廊）
    ///   - config: 布局尺寸配置
    ///   - audioVideoConfig: 视图样式配置（边距、比例等）
    public func setLayout(_ mode:ZegoUIKitLayoutMode, config: ZegoLayoutConfig, audioVideoConfig: ZegoAudioVideoViewConfig) {
        switch mode {
        case .pictureInPicture,.gallery:
            self.view.delegate = self.help
            self.view.setLayout(mode, config: config, audioVideoConfig: audioVideoConfig)
        case .invalid:
            // 必须设置有效的布局模式
            fatalError("A valid mode must be set")
        }
    }
    
    /// 设置布局模式（高级版）
    /// - Parameters:
    ///   - layout: 包含模式和配置的布局对象
    ///   - audioVideoConfig: 视图样式配置
    public func setLayout(_ layout: ZegoLayout, audioVideoConfig: ZegoAudioVideoViewConfig) {
        guard let config = layout.config else {
            // 布局配置不能为空
            fatalError("Layout config must be set")
        }
        
        // 模式匹配校验
        switch layout.mode {
        case .pictureInPicture, .gallery:
            self.view.delegate = self.help
            self.view.setLayout(layout.mode, config: config, audioVideoConfig: audioVideoConfig)
        case .invalid:
            // 非法的布局模式
            fatalError("A valid mode must be set")
        }
    }
    
    /// 重新加载容器视图
    /// 典型场景：用户列表变化后刷新布局
    public func reload() {
        self.view.reload()
    }
    
    // MARK: 生命周期
    deinit {
        xLog("ZegoAudioVideoContainer deinit")
    }
}

// MARK: - 事件处理帮助类（私有）
fileprivate class ZegoAudioVideoContainer_Help: NSObject, ZegoUIKitEventHandle, ZegoAudioVideoContainerViewDelegate {
    
    // MARK: 弱引用
    weak var container: ZegoAudioVideoContainer?
    
    // MARK: 视图代理方法
    /// 获取前景视图（透传给业务委托）
    func getForegroundView(_ userInfo: ZegoUIKitUser?) -> ZegoBaseAudioVideoForegroundView? {
        return self.container?.delegate?.getForegroundView(userInfo)
    }
    
    /// 用户排序（透传给业务委托）
    func sortAudioVideo(_ userList: [ZegoUIKitUser]) -> [ZegoUIKitUser]? {
        return self.container?.delegate?.sortAudioVideo(userList)
    }
    
    // MARK: 用户ID映射
    func onUserIDUpdated(userID: String) -> String? {
        return self.container?.delegate?.onUserIDUpdated(userID: userID)
    }
}
